package com.yulan.dp.gupiao;

import org.junit.Test;

/**
 * 188. 买卖股票的最佳时机 IV
 * 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
 */
public class LeetCode_188 {
    public int maxProfit(int k, int[] prices) {
        int n = prices.length;
        if(k<1) return 0;
        if(k>n/2){
            return maxProfit_k_int(prices);
        }

        //i: 第几次  j: 0 买 1 卖
        int[][] dp = new int[k][2];

        for(int i = 0;i<k;i++){
            dp[i][0] = Integer.MIN_VALUE;
        }

        for(int p:prices){
            dp[0][0] = Math.max(dp[0][0],0-p); // 第一次买
            dp[0][1] = Math.max(dp[0][1],dp[0][0] + p); // 第一次卖
            for(int i = 1 ;i<k;i++){
                dp[i][0] = Math.max(dp[i][0],dp[i-1][1] - p );
                dp[i][1] = Math.max(dp[i][1] , dp[i][0] + p);
            }
        }

        return dp[k-1][1];
    }

    public int maxProfit_k_int(int[] prices) {
        int res = 0;
        for(int i = 1;i<prices.length;i++){
            if(prices[i] > prices[i-1]){
                res += prices[i] - prices[i-1] ;
            }
        }
        return res;
    }

    @Test
    public void test(){
        int[] arr = {3,2,6,5,0,3};
        int k = 2;
        System.out.println(maxProfit(k , arr));
    }
}
